home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / IO / streambuf.C < prev    next >
C/C++ Source or Header  |  1990-12-06  |  2KB  |  112 lines

  1. //$streambuf$
  2. #include "streambuf.h"
  3. #include "../String.h"
  4.  
  5. streambuf::streambuf()
  6. {
  7.     setbuf(0, 0, 0, FALSE);
  8. }
  9.  
  10. streambuf::streambuf(char* p, int l, int count)
  11. {
  12.     if (p)
  13.     setbuf(p, l, count, FALSE);
  14.     else
  15.     setbuf(new char[l], l, count, TRUE);
  16. }
  17.  
  18. streambuf::~streambuf()
  19. {
  20.     if (alloc)
  21.     SafeDelete(base);
  22. }
  23.  
  24. streambuf *streambuf::setbuf(char *p, int len, int count, bool all)
  25. {
  26.     base= gptr= p;
  27.     pptr= p + count;
  28.     eptr= base + len;
  29.     alloc= all;
  30.     return this;
  31. }
  32.  
  33. int streambuf::doallocate()
  34. {
  35.     if (base= new char[BUFSIZE]) {
  36.     setbuf(base, BUFSIZE, 0, TRUE);
  37.     return 0;
  38.     }
  39.     return EOF;
  40. }
  41.  
  42. int streambuf::overflow(int c)
  43. {
  44.     if (allocate() == EOF)
  45.     return EOF;
  46.     if (c != EOF)
  47.     *pptr++ = c;
  48.     return zapeof(c);
  49. }
  50.  
  51. int streambuf::underflow()
  52. {
  53.     return EOF;
  54. }
  55.  
  56. int streambuf::sputn(const char *s, int n)
  57. {
  58.     register int avail= eptr-pptr;
  59.     register int req= n;
  60.     
  61.     while (avail < req) {
  62.     memcpy(pptr, s, avail);
  63.     s+= avail;
  64.     pptr+= avail;
  65.     req-= avail;
  66.     if (overflow(zapeof(*s++)) == EOF)
  67.         return n-req ;
  68.     --req ;
  69.     avail= eptr-pptr;
  70.     }
  71.     memcpy(pptr, s, req);
  72.     pptr+= req;
  73.     return n;
  74. }
  75.  
  76. int streambuf::sgetn(char *s, int n)
  77. {
  78.     register int avail= pptr-gptr;
  79.     register char* p= s;
  80.     register int req= n;
  81.     
  82.     while (avail < req) {
  83.     memcpy(p, gptr, avail) ;
  84.     p+= avail;
  85.     req-= avail;
  86.     gptr+= avail;
  87.     if (underflow() == EOF)
  88.         return p-s;
  89.     avail= pptr-gptr;
  90.     }
  91.  
  92.     memcpy(p, gptr, req);
  93.     gptr+= req;
  94.     return n;
  95. }
  96.  
  97. int streambuf::seek(long pos, bool inout)
  98. {
  99.     if (inout)
  100.     pptr= base+pos;
  101.     else
  102.     gptr= base+pos;
  103.     return 0;
  104. }
  105.  
  106. long streambuf::tell(bool inout)
  107. {
  108.     if (inout)
  109.     return (long) (pptr-base);
  110.     return (long) (gptr-base);
  111. }
  112.